linux安装nginx
- 安装nginx所需的依赖
1 | yum -y install gcc pcre-devel zlib-devel openssl openssl-devel |
在/usr/local/下创建nginx目录
https://nginx.org/download/下载tar.gz包,并解压tar -zxvf xxxx.tar.gz
配置./configure –prefix=/usr/local/nginx
执行make && make install
切换到/usr/local/nginx/sbin,执行nginx -t
如果出现以下,则说明安装成功。
1 | [root@ming sbin]# ./nginx -t |
- 运行nginx,执行./nginx
如果出现以下界面,说明安装成功。
- 如果打不开,检查防火墙是不是没开放80端口。
1 | firewall-cmd --query-port=80/tcp |
- 配置nginx开机自启动
1 | vi /etc/rc.d/rc.local |
添加以下内容
1 | nginx开机自启动 |
获取真实IP
remote_addr: 记录的是上一级代理的IP,如果只有一层代理,上一层是客户端,即remote_addr就是客户端的真实ip地址。remote_addr不会被篡改,因为如果被篡改了,TCP三次握手连接都不会成功。
x_real_ip: 字面意思上看是真实ip,多层代理都可以设置,但会覆盖上一级代理的值。如果nginx中配置了proxy_set_header X_Real_IP $remote_addr
,则x_real_ip记录的是上一级代理的ip。
例如,存在以下的多层代理:client(10.160.10.1) -> proxy1(10.160.10.70) -> proxy2(10.160.10.71) -> 云服务器()
假设在proxy1和proxy2中都设置了proxy_set_header X_Real_IP $remote_addr
,那么到了云服务器那层的日志获取到的X_Real_IP就是上一层代理proxy2的ip:10.160.10.71
X_Forwarder_For: 记录请求的路由顺序,会把每一层代理的X_Forwarder_For都连接起来,用逗号分隔开。
例如上面的代理,如果proxy1和proxy2都设置了proxy_set_header X_Forwarder_For $proxy_add_x_̲forwarded_for
,那么到了云服务器那层的日志获取到的X_Forwarder_For:10.160.10.1 -> 10.160.10.70 ,不会包含proxy2的ip地址,proxy2的地址可以通过remote_addr来获取。
如果nginx中设置的是proxy_set_header X_Forwarder_For $remote_addr
,则经过每一层代理,X_Forwarder_For都不会被追加,而是被上一层的remote_addr覆盖了。
一般来说,X_Forwarder_For的第一个IP就是客户端的真实IP地址,但是X_Forwarder_For是可以伪造的。比如在第一层代理proxy1之前使用curl添加X_Forwarder_For:1.1.1.1,这样proxy1记录X_Forwarder_For的时候,记录的值是1.1.1.1,10.160.10.82. 实际上第二个IP才是客户端真正的IP地址。
为了防止伪造X_Forwarder_For,可以配置覆盖X_Forwarder_For而不是追加,但是要根据具体的场景分析:
1 | proxy_set_header X-Real-IP $remote_addr; |
如果只有一层代理的情况,以上的配置就可以直接通过X_Forwarder_For直接获取客户端真实的IP地址。即使有人伪造X_Forwarded_For|X_Real_IP请求头,也会被强制替换成remote_addr.
如果只有一层代理,X_Real_IP与X_Forwarder_For是等效的。
小结:
1.如果部署的服务没有任何的代理,后端只能通过remote_addr获取IP地址,不要相信任何的请求头,因为请求头可以伪造。
2.如果部署的服务有经过代理,在代理配置正确的前提下,可以通过X_Forwarder_For记录的第一个IP来获取客户端真实的IP地址,但是需要校验是否符合IP的格式,因为伪造的请求头可以是任何形式。如果只有一层代理,也可以使用X_Real_IP来获取客户端真实的IP地址,而且在只有一层代理的情况下,X_Real_IP不会被伪造的请求头替换,因为会被强制替换成remote_addr.
同时,使用了代理之后,应该禁止外部直接连到后端服务器,因为直接连到后端服务器没有经过代理服务器,是没有X_Forwarder_For和X_Real_IP的请求头的。
springboot关于获取真实IP的配置
配置remote-ip-header导致X_Forwarded_For丢失
Nginx + Tomat获取客户端真实IP
Nginx根据IP匹配不同的URL